Population GDP Avg Temperature
library(tidyverse)
[30m── [1mAttaching packages[22m ────────────────────────────────────────── tidyverse 1.3.0 ──[39m
[30m[32m✔[30m [34mggplot2[30m 3.2.1 [32m✔[30m [34mpurrr [30m 0.3.3
[32m✔[30m [34mtibble [30m 2.1.3 [32m✔[30m [34mdplyr [30m 0.8.3
[32m✔[30m [34mtidyr [30m 1.0.2 [32m✔[30m [34mstringr[30m 1.4.0
[32m✔[30m [34mreadr [30m 1.3.1 [32m✔[30m [34mforcats[30m 0.4.0[39m
[30m── [1mConflicts[22m ───────────────────────────────────────────── tidyverse_conflicts() ──
[31m✖[30m [34mdplyr[30m::[32mfilter()[30m masks [34mstats[30m::filter()
[31m✖[30m [34mdplyr[30m::[32mlag()[30m masks [34mstats[30m::lag()[39m
library(anchors)
Loading required package: rgenoud
## rgenoud (Version 5.8-3.0, Build Date: 2019-01-22)
## See http://sekhon.berkeley.edu/rgenoud for additional documentation.
## Please cite software as:
## Walter Mebane, Jr. and Jasjeet S. Sekhon. 2011.
## ``Genetic Optimization Using Derivatives: The rgenoud package for R.''
## Journal of Statistical Software, 42(11): 1-26.
##
Loading required package: MASS
Attaching package: ‘MASS’
The following object is masked from ‘package:dplyr’:
select
## anchors (Version 3.0-8, Build Date: 2014-02-24)
## See http://wand.stanford.edu/anchors for additional documentation and support.
library(moderndive)
Code to Set Up our CSV file
The code in this chunk below sums up all the cases for countries that are broken into regions so we can have one value per row for those countries. We had to do this for the US, China, and Australia.
virus = read_csv("covid_19_clean_complete.csv")
Parsed with column specification:
cols(
Province_State = [31mcol_character()[39m,
Country_Region = [31mcol_character()[39m,
Lat = [32mcol_double()[39m,
Long = [32mcol_double()[39m,
Date = [34mcol_date(format = "")[39m,
Confirmed = [32mcol_double()[39m,
Deaths = [32mcol_double()[39m,
Recovered = [32mcol_double()[39m,
Active = [32mcol_double()[39m,
`WHO Region` = [31mcol_character()[39m
)
virus <- replace.value(virus,"Country_Region",from = "US",to = "United States") #Replacing value of US with value United States
#US_virus is the data with the cruise ships filtered out and sums up all the cases in each county and combines them into a total number of cases grouped by date
#No_US_virus is the data without the US and is just for all the other countries
#country_virus is the final dataset grouped by country
#US_virus = virus %>% filter(Country_Region == "US") %>% filter(Province_State != "Grand Princess Cruise Ship",Province_State != "Omaha, NE (From Diamond Princess)",Province_State != "Travis, CA (From Diamond Princess)",Province_State != "Lackland, TX (From Diamond Princess)",Province_State != "Unassigned Location (From Diamond Princess)") %>% group_by(Date) %>% summarize(Confirmed = sum(Confirmed),Deaths = sum(Deaths), Recovered = sum(Recovered)) %>% mutate("Province_State" = "US", "Country_Region" = "US") #OLD DATSET CODE; new dataset broken into cities and countries
#Code for Second Version of Dataset until 3/25
#US_virus = virus %>% filter(Country_Region == "United States")%>% group_by(Date) %>% separate(col = Province_State, into = c("City_or_County","State"),sep = ",") %>% filter(is.na(State)== T)%>% summarize(Confirmed = sum(Confirmed),Deaths = sum(Deaths), Recovered = sum(Recovered)) %>% mutate("Province_State" = "United States", "Country_Region" = "United States")
US_virus = virus %>% filter(Country_Region == "United States")%>% group_by(Date) %>% separate(col = Province_State, into = c("City_or_County","State"),sep = ",") %>% filter(is.na(State)== T)%>% summarize(Confirmed = sum(Confirmed),Deaths = sum(Deaths)) %>% mutate("Province_State" = "United States", "Country_Region" = "United States")
No_US_virus = virus %>% filter(Country_Region != "United States",Country_Region != "China",Country_Region != "Australia",Country_Region != "Canada")
country_virus = full_join(No_US_virus, US_virus)
Joining, by = c("Province_State", "Country_Region", "Date", "Confirmed", "Deaths")
country_virus %>% filter(Country_Region == "United States")
#For China
China_virus = virus %>% filter(Country_Region == "China") %>% group_by(Date) %>% summarize(Confirmed = sum(Confirmed),Deaths = sum(Deaths)) %>% mutate("Province_State" = "China", "Country_Region" = "China")
No_China_virus = virus %>% filter(Country_Region != "China", Country_Region != "United States",Country_Region != "Australia",Country_Region != "Canada")
country_virus1 = full_join(No_China_virus, China_virus)
Joining, by = c("Province_State", "Country_Region", "Date", "Confirmed", "Deaths")
#For Canada
Canada_virus = virus %>% filter(Country_Region == "Canada") %>% group_by(Date) %>% summarize(Confirmed = sum(Confirmed),Deaths = sum(Deaths)) %>% mutate("Province_State" = "Canada", "Country_Region" = "Canada")
No_Canada_virus = virus %>% filter(Country_Region != "China", Country_Region != "United States",Country_Region != "Australia", Country_Region != "Canada")
country_virus11 = full_join(No_Canada_virus, Canada_virus)
Joining, by = c("Province_State", "Country_Region", "Date", "Confirmed", "Deaths")
#For Australia
Australia_virus = virus %>% filter(Country_Region == "Australia")%>% group_by(Date) %>% summarize(Confirmed = sum(Confirmed),Deaths = sum(Deaths)) %>% mutate("Province_State" = "Australia", "Country_Region" = "Australia")
No_Australia_virus = virus %>% filter(Country_Region != "Australia", Country_Region != "United States",Country_Region != "China", Country_Region != "Canada")
country_virus2 = full_join(No_Australia_virus, Australia_virus)
Joining, by = c("Province_State", "Country_Region", "Date", "Confirmed", "Deaths")
predata = full_join(country_virus,country_virus1)
Joining, by = c("Province_State", "Country_Region", "Lat", "Long", "Date", "Confirmed", "Deaths", "Recovered", "Active", "WHO Region")
mydata = full_join(predata,country_virus2)
Joining, by = c("Province_State", "Country_Region", "Lat", "Long", "Date", "Confirmed", "Deaths", "Recovered", "Active", "WHO Region")
mydata2 = full_join(mydata,country_virus11)
Joining, by = c("Province_State", "Country_Region", "Lat", "Long", "Date", "Confirmed", "Deaths", "Recovered", "Active", "WHO Region")
#mydata2 %>% filter(Country_Region == "Canada")
mydata2
#GDPandWeather = GDPandWeather %>% rename("Country_Region"= Country)
GDPandWeather
partialdata = left_join(mydata2,GDPandWeather,by = "Country_Region")
country_population_2 = country_population_1 %>% rename("Country_Region"= Country)
ourfinaldata = left_join(partialdata,country_population_2, by = "Country_Region")
Filter by the previous day to make sure we have the most recent data.
ourfinaldata %>% filter(Country_Region == "United States")
ourfinaldata
poster = ourfinaldata %>% dplyr::select(-Province_State,-Recovered)
write_csv(ourfinaldata, "ourfinaldata.csv")
library(lubridate)
Attaching package: ‘lubridate’
The following object is masked from ‘package:base’:
date
Code to Analyze our CSV file
#Formatting the variable date as mdy and ordering it
ourfinaldata$Date <-as.Date(ourfinaldata$Date, format = "%m/%d/%y")
#One Plot of World Deaths
ourfinaldata %>% group_by(Date) %>% summarize(Total = sum(Confirmed,na.rm = TRUE), Dead_count = sum(Deaths,na.rm = TRUE)) %>% ggplot() + geom_line(aes(x = Date, y = Total,group=1, size = Dead_count)) + ggtitle("World Cases and Deaths Graph 1")

#Another Plot of World Deaths
ourfinaldata %>% group_by(Date) %>% summarize(Total = sum(Confirmed,na.rm = TRUE), Dead_count = sum(Deaths,na.rm = TRUE)) %>% ggplot() + geom_line(aes(x = Date, y = Total,group = 1), linetype = "dashed") + geom_line(aes(x = Date, y = Dead_count, group = 1), color = "red")+ ggtitle("World Cases and Deaths Graph 2")

#Deaths in China
ourfinaldata %>% filter(Country_Region == "China") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("China Cases and Deaths")

#Deaths in United States
ourfinaldata %>% filter(Country_Region == "United States") %>% group_by(Date) %>% arrange(Date)%>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("United States Cases and Deaths")

USA_trends = ourfinaldata %>% filter(Country_Region == "United States") %>% group_by(Date) %>% arrange(Date)
write_csv(USA_trends, "USA_trends.csv")
#Deaths in South Korea
ourfinaldata %>% filter(Country_Region == "South Korea") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("South Korea Cases and Deaths")

#Deaths in Italy
ourfinaldata %>% filter(Country_Region == "Italy") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Italy Cases and Deaths")

#Deaths in Spain
ourfinaldata %>% filter(Country_Region == "Spain") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Spain Cases and Deaths")

#Deaths in Iran
ourfinaldata %>% filter(Country_Region == "Iran") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Iran Cases and Deaths")

#Deaths in Sweeden
ourfinaldata %>% filter(Country_Region == "Sweden") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Sweden Cases and Deaths")

#Deaths in Canada
ourfinaldata %>% filter(Country_Region == "Canada") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Canada Cases and Deaths")

#Deaths in Japan
ourfinaldata %>% filter(Country_Region == "Japan") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Japan Cases and Deaths")

#Deaths in Costa Rica
ourfinaldata %>% filter(Country_Region == "Costa Rica") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Costa Rica Cases and Deaths")

#Deaths in Germany
ourfinaldata %>% filter(Country_Region == "Germany") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Germany Cases and Deaths")

#Deaths in United Kingdom
ourfinaldata %>% filter(Country_Region == "United Kingdom"& is.na(Province_State)) %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("United Kingdom Cases and Deaths")

#Deaths in France
ourfinaldata %>% filter(Country_Region == "France" & is.na(Province_State)) %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("France Cases and Deaths")

#Russia
ourfinaldata %>% filter(Country_Region == "Russia") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Russia Cases and Deaths")

#Egypt
ourfinaldata %>% filter(Country_Region == "Egypt") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Egypt Cases and Deaths")

#South Africa
ourfinaldata %>% filter(Country_Region == "South Africa") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("South Africa Cases and Deaths")

#Finlad
ourfinaldata %>% filter(Country_Region == "Finland") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Finland Cases and Deaths")

#Austria
ourfinaldata %>% filter(Country_Region == "Austria") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Austria Cases and Deaths")

#Portugal
ourfinaldata %>% filter(Country_Region == "Portugal") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Portugal Cases and Deaths")

#Indonesia
ourfinaldata %>% filter(Country_Region == "Indonesia") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Indonesia Cases and Deaths")

#Australia
ourfinaldata %>% filter(Country_Region == "Australia") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Australia Cases and Deaths")

#Mexico
ourfinaldata %>% filter(Country_Region == "Mexico") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Mexico Cases and Deaths")

#Serbia
ourfinaldata %>% filter(Country_Region == "Serbia") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Serbia Cases and Deaths")

#Iceland
ourfinaldata %>% filter(Country_Region == "Iceland") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Iceland Cases and Deaths")

#Afghanistan
ourfinaldata %>% filter(Country_Region == "Afghanistan") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Afghanistan Cases and Deaths")

#Norway
ourfinaldata %>% filter(Country_Region == "Norway") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Norway Cases and Deaths")

#Comparison of Total Cases in each country
ourfinaldata %>% filter(Country_Region == "United States"|Country_Region == "Italy"|Country_Region=="China"|Country_Region == "Spain"|Country_Region == "Iran"|Country_Region == "Australia"|Country_Region == "South Korea"|Country_Region == "Canada"|Country_Region == "Brazil" ) %>% ggplot(mapping = aes(x=Date,y = Confirmed, color = Country_Region))+geom_line() +ggtitle("Total Confirmed Cases Over Time")

ourfinaldata %>% filter(Country_Region == "United States"|Country_Region == "Italy"|Country_Region=="China"|Country_Region == "Spain"|Country_Region == "Iran"|Country_Region == "Australia"|Country_Region == "South Korea"|Country_Region == "Canada"|Country_Region == "Brazil") %>% ggplot(mapping = aes(x=Date,y = Deaths, color = Country_Region))+geom_line() +ggtitle("Total Confirmed Deaths Over Time")

Plots of the Percentage of Population Infected
#Note the y-axis for these graphs should be 0-100 because calculated as a percent but this shows how few people have it at this point
#USA
ourfinaldata %>%filter(Country_Region == "United States") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in the USA")

#China
ourfinaldata %>%filter(Country_Region == "China") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in China")

#Italy
ourfinaldata %>%filter(Country_Region == "Italy") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in Italy")

#Spain
ourfinaldata %>%filter(Country_Region == "Spain") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in Spain")

#India
ourfinaldata %>%filter(Country_Region == "India") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in India")

#Iran
ourfinaldata %>%filter(Country_Region == "Iran") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in Iran")

#South Africa
ourfinaldata %>%filter(Country_Region == "South Africa") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in South Africa")

Logistic Growth for Italy
ourfinaldata %>% filter(Country_Region == "Italy") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Italy Cases and Deaths")

num_days_Italy = nrow(ourfinaldata %>% filter(Country_Region == "Italy",Confirmed >=1))
Italy_dat = ourfinaldata %>% filter(Country_Region == "Italy",Confirmed >=1) %>% mutate("Num_Days_Since_Start"=c(1:num_days_Italy))
Italy_mod = nls(Confirmed ~ c/(1+a*exp(b*Num_Days_Since_Start)), start = list(a=100, b = -0.13, c = max(Italy_dat$Confirmed)), data = Italy_dat)
coef(summary(Italy_mod))
Estimate Std. Error t value Pr(>|t|)
a 3.861112e+02 4.393362e+01 8.788513 8.127566e-15
b -9.225626e-02 1.846467e-03 -49.963657 2.830435e-86
c 2.294176e+05 1.094010e+03 209.703429 2.572178e-165
plot(Italy_dat$Num_Days_Since_Start,Italy_dat$Confirmed,xlab = "Number of Days Since Start",ylab = "Number of Confirmed Cases",main = "Logistic Regression for Italy")
curve(2.145977e+05/(1+692.2*exp(x*-0.104)), col = "blue", add = TRUE)

#lines(Italy_dat$Num_Days_Since_Start, predict(Italy_mod), col = 2)
Logistic Growth for United States
num_days_USA = nrow(ourfinaldata %>% filter(Country_Region == "United States",Confirmed >1))
USA_dat = ourfinaldata %>% filter(Country_Region == "United States",Confirmed >1) %>% mutate("Num_Days_Since_Start"=c(1:num_days_USA)) %>% arrange(Date)
#Using Nonlinear Least Squares Logistic Growth Model
#USA_mod = nls(Confirmed ~ c/(1+a*exp(b*Num_Days_Since_Start)), start = list(a=30000.3, b = -0.10, c = max(USA_dat$Confirmed)), data = USA_dat)
#coef(summary(USA_mod))
Logistic Growth for China
num_days_China = nrow(ourfinaldata %>% filter(Country_Region == "China",Confirmed >3))
China_dat = ourfinaldata %>% filter(Country_Region == "China",Confirmed >3) %>% mutate("Num_Days_Since_Start"=c(1:num_days_China)) %>% arrange(Date)
#Using Nonlinear Least Squares Logistic Growth Model
China_mod = nls(Confirmed ~ c/(1+a*exp(b*Num_Days_Since_Start)), start = list(a=65.29, b = -0.223, c = 83787), data = China_dat)
coef(summary(China_mod))
Estimate Std. Error t value Pr(>|t|)
a 55.3377334 4.854292e+00 11.39975 1.260588e-21
b -0.2104574 4.488438e-03 -46.88879 1.159049e-86
c 82924.2197982 1.685054e+02 492.11618 9.132441e-226
plot(China_dat$Num_Days_Since_Start,China_dat$Confirmed,xlab = "Number of Days Since Start",ylab = "Number of Confirmed Cases",main = "Logistic Regression for China")
curve(77131.26/(1+479.15*exp(x*-0.480)), col = "blue", add = TRUE)

Logistic Growth for Spain
num_days_Spain = nrow(ourfinaldata %>% filter(Country_Region == "Spain",Confirmed >3))
Spain_dat = ourfinaldata %>% filter(Country_Region == "Spain",Confirmed >3) %>% mutate("Num_Days_Since_Start"=c(1:num_days_Spain)) %>% arrange(Date)
#Using Nonlinear Least Squares Logistic Growth Model
Spain_mod = nls(Confirmed ~ c/(1+a*exp(b*Num_Days_Since_Start)), start = list(a=30.29, b = -0.20, c = 191726), data = Spain_dat)
coef(summary(Spain_mod))
Estimate Std. Error t value Pr(>|t|)
a 1.499439e+02 1.875001e+01 7.997004 1.869431e-12
b -1.249607e-01 3.193219e-03 -39.133135 4.826404e-64
c 2.320023e+05 1.127359e+03 205.792794 1.338163e-137
Developing Countries
List of developing countries in our dataset: Chad, Central African Republic, Bhutan, Afghanistan, Mali, Malawi, Eritrea, Haiti, Benin, Niger, Laos, Guinea, Cambodia, Mauritania, Liberia, Bangladesh, Georgia, Panama, Bulgaria
Logistic Growth for Developing Countries
Logistic Growth for Bulgaria
#Bulgaria
ourfinaldata %>% filter(Country_Region == "Bulgaria") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Bulgaria Cases and Deaths")

num_days_Bulgaria = nrow(ourfinaldata %>% filter(Country_Region == "Bulgaria",Confirmed >3))
Bulgaria_dat = ourfinaldata %>% filter(Country_Region == "Bulgaria",Confirmed >=1) %>% mutate("Num_Days_Since_Start"=c(1:num_days_Bulgaria))
Bulgaria_mod = nls(Confirmed ~ c/(1+a*exp(b*Num_Days_Since_Start)), start = list(a=16.7, b = -0.1489, c = 788.76), data = Bulgaria_dat)
coef(summary(Bulgaria_mod))
Estimate Std. Error t value Pr(>|t|)
a 36.93230558 2.011606308 18.35961 1.613310e-32
b -0.06734297 0.001361859 -49.44930 4.574813e-68
c 2898.14046824 29.930246579 96.82982 2.224697e-94
Cambodia Logistic Growth
ourfinaldata %>% filter(Country_Region == "Cambodia") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Cambodia Cases and Deaths")

num_days_Cambodia = nrow(ourfinaldata %>% filter(Country_Region == "Cambodia",Confirmed >=1))
Cambodia_dat = ourfinaldata %>% filter(Country_Region == "Cambodia",Confirmed >=1) %>% mutate("Num_Days_Since_Start"=c(1:num_days_Cambodia))
Cambodia_mod = nls(Confirmed ~ c/(1+a*exp(b*Num_Days_Since_Start)), start = list(a=16.7, b = -0.1, c = 140), data = Cambodia_dat)
coef(summary(Cambodia_mod))
Estimate Std. Error t value Pr(>|t|)
a 1.985966e+07 1.196141e+07 1.660311 9.920775e-02
b -3.041262e-01 1.091909e-02 -27.852713 2.354166e-57
c 1.217189e+02 4.299553e-01 283.096718 8.326562e-187
plot(Cambodia_dat$Num_Days_Since_Start,Cambodia_dat$Confirmed,xlab = "Number of Days Since Start",ylab = "Number of Confirmed Cases",main = "Logistic Regression for Cambodia")
curve(117.01/(1+1.656584e+08*exp(x*-0.345)), col = 4, add = TRUE)

#lines(Cambodia_dat$Num_Days_Since_Start, predict(Cambodia_mod), col = 2)
ourfinaldata %>% filter(Country_Region == "Panama" | Country_Region == "Norway"| Country_Region == "Georgia"|Country_Region == "Bangladesh"|Country_Region == "Guinea")%>% group_by(Date,Country_Region)%>% ggplot(mapping = aes(x = Date, y = Confirmed,color = Country_Region))+geom_line()+ggtitle("Confirmed Cases across the World")

Junk
ourfinaldata %>% filter(Country_Region == "Brazil") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Brazil Cases and Deaths")

LS0tCnRpdGxlOiAiQ29yb25vdmlydXNfRmluYWxQcm9qZWN0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgpQb3B1bGF0aW9uCkdEUApBdmcgVGVtcGVyYXR1cmUKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShhbmNob3JzKQpsaWJyYXJ5KG1vZGVybmRpdmUpCmBgYAoKI0NvZGUgdG8gU2V0IFVwIG91ciBDU1YgZmlsZQpUaGUgY29kZSBpbiB0aGlzIGNodW5rIGJlbG93IHN1bXMgdXAgYWxsIHRoZSBjYXNlcyBmb3IgY291bnRyaWVzIHRoYXQgYXJlIGJyb2tlbiBpbnRvIHJlZ2lvbnMgc28gd2UgY2FuIGhhdmUgb25lIHZhbHVlIHBlciByb3cgZm9yIHRob3NlIGNvdW50cmllcy4gIFdlIGhhZCB0byBkbyB0aGlzIGZvciB0aGUgVVMsIENoaW5hLCBhbmQgQXVzdHJhbGlhLgpgYGB7cn0KdmlydXMgPSByZWFkX2NzdigiY292aWRfMTlfY2xlYW5fY29tcGxldGUuY3N2IikKdmlydXMgPC0gcmVwbGFjZS52YWx1ZSh2aXJ1cywiQ291bnRyeV9SZWdpb24iLGZyb20gPSAiVVMiLHRvID0gIlVuaXRlZCBTdGF0ZXMiKSAjUmVwbGFjaW5nIHZhbHVlIG9mIFVTIHdpdGggdmFsdWUgVW5pdGVkIFN0YXRlcwoKI1VTX3ZpcnVzIGlzIHRoZSBkYXRhIHdpdGggdGhlIGNydWlzZSBzaGlwcyBmaWx0ZXJlZCBvdXQgYW5kIHN1bXMgdXAgYWxsIHRoZSBjYXNlcyBpbiBlYWNoIGNvdW50eSBhbmQgY29tYmluZXMgdGhlbSBpbnRvIGEgdG90YWwgbnVtYmVyIG9mIGNhc2VzIGdyb3VwZWQgYnkgZGF0ZQojTm9fVVNfdmlydXMgaXMgdGhlIGRhdGEgd2l0aG91dCB0aGUgVVMgYW5kIGlzIGp1c3QgZm9yIGFsbCB0aGUgb3RoZXIgY291bnRyaWVzCiNjb3VudHJ5X3ZpcnVzIGlzIHRoZSBmaW5hbCBkYXRhc2V0IGdyb3VwZWQgYnkgY291bnRyeQoKCiNVU192aXJ1cyA9IHZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVTIikgJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSAhPSAiR3JhbmQgUHJpbmNlc3MgQ3J1aXNlIFNoaXAiLFByb3ZpbmNlX1N0YXRlICE9ICJPbWFoYSwgTkUgKEZyb20gRGlhbW9uZCBQcmluY2VzcykiLFByb3ZpbmNlX1N0YXRlICE9ICJUcmF2aXMsIENBIChGcm9tIERpYW1vbmQgUHJpbmNlc3MpIixQcm92aW5jZV9TdGF0ZSAhPSAiTGFja2xhbmQsIFRYIChGcm9tIERpYW1vbmQgUHJpbmNlc3MpIixQcm92aW5jZV9TdGF0ZSAhPSAiVW5hc3NpZ25lZCBMb2NhdGlvbiAoRnJvbSBEaWFtb25kIFByaW5jZXNzKSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgc3VtbWFyaXplKENvbmZpcm1lZCA9IHN1bShDb25maXJtZWQpLERlYXRocyA9IHN1bShEZWF0aHMpLCBSZWNvdmVyZWQgPSBzdW0oUmVjb3ZlcmVkKSkgJT4lIG11dGF0ZSgiUHJvdmluY2VfU3RhdGUiID0gIlVTIiwgIkNvdW50cnlfUmVnaW9uIiA9ICJVUyIpICNPTEQgREFUU0VUIENPREU7IG5ldyBkYXRhc2V0IGJyb2tlbiBpbnRvIGNpdGllcyBhbmQgY291bnRyaWVzCgojQ29kZSBmb3IgU2Vjb25kIFZlcnNpb24gb2YgRGF0YXNldCB1bnRpbCAzLzI1CiNVU192aXJ1cyA9IHZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMiKSU+JSBncm91cF9ieShEYXRlKSAlPiUgc2VwYXJhdGUoY29sID0gUHJvdmluY2VfU3RhdGUsIGludG8gPSBjKCJDaXR5X29yX0NvdW50eSIsIlN0YXRlIiksc2VwID0gIiwiKSAlPiUgZmlsdGVyKGlzLm5hKFN0YXRlKT09IFQpJT4lIHN1bW1hcml6ZShDb25maXJtZWQgPSBzdW0oQ29uZmlybWVkKSxEZWF0aHMgPSBzdW0oRGVhdGhzKSwgUmVjb3ZlcmVkID0gc3VtKFJlY292ZXJlZCkpICU+JSBtdXRhdGUoIlByb3ZpbmNlX1N0YXRlIiA9ICJVbml0ZWQgU3RhdGVzIiwgIkNvdW50cnlfUmVnaW9uIiA9ICJVbml0ZWQgU3RhdGVzIikKVVNfdmlydXMgPSB2aXJ1cyAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJVbml0ZWQgU3RhdGVzIiklPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lIHNlcGFyYXRlKGNvbCA9IFByb3ZpbmNlX1N0YXRlLCBpbnRvID0gYygiQ2l0eV9vcl9Db3VudHkiLCJTdGF0ZSIpLHNlcCA9ICIsIikgJT4lIGZpbHRlcihpcy5uYShTdGF0ZSk9PSBUKSU+JSBzdW1tYXJpemUoQ29uZmlybWVkID0gc3VtKENvbmZpcm1lZCksRGVhdGhzID0gc3VtKERlYXRocykpICU+JSBtdXRhdGUoIlByb3ZpbmNlX1N0YXRlIiA9ICJVbml0ZWQgU3RhdGVzIiwgIkNvdW50cnlfUmVnaW9uIiA9ICJVbml0ZWQgU3RhdGVzIikKCk5vX1VTX3ZpcnVzID0gdmlydXMgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiAhPSAiVW5pdGVkIFN0YXRlcyIsQ291bnRyeV9SZWdpb24gIT0gIkNoaW5hIixDb3VudHJ5X1JlZ2lvbiAhPSAiQXVzdHJhbGlhIixDb3VudHJ5X1JlZ2lvbiAhPSAiQ2FuYWRhIikKCmNvdW50cnlfdmlydXMgPSBmdWxsX2pvaW4oTm9fVVNfdmlydXMsIFVTX3ZpcnVzKQpjb3VudHJ5X3ZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMiKQoKI0ZvciBDaGluYQpDaGluYV92aXJ1cyA9IHZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkNoaW5hIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSBzdW1tYXJpemUoQ29uZmlybWVkID0gc3VtKENvbmZpcm1lZCksRGVhdGhzID0gc3VtKERlYXRocykpICU+JSBtdXRhdGUoIlByb3ZpbmNlX1N0YXRlIiA9ICJDaGluYSIsICJDb3VudHJ5X1JlZ2lvbiIgPSAiQ2hpbmEiKQpOb19DaGluYV92aXJ1cyA9IHZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gIT0gIkNoaW5hIiwgQ291bnRyeV9SZWdpb24gIT0gIlVuaXRlZCBTdGF0ZXMiLENvdW50cnlfUmVnaW9uICE9ICJBdXN0cmFsaWEiLENvdW50cnlfUmVnaW9uICE9ICJDYW5hZGEiKQpjb3VudHJ5X3ZpcnVzMSA9IGZ1bGxfam9pbihOb19DaGluYV92aXJ1cywgQ2hpbmFfdmlydXMpCgojRm9yIENhbmFkYQpDYW5hZGFfdmlydXMgPSB2aXJ1cyAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJDYW5hZGEiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lIHN1bW1hcml6ZShDb25maXJtZWQgPSBzdW0oQ29uZmlybWVkKSxEZWF0aHMgPSBzdW0oRGVhdGhzKSkgJT4lIG11dGF0ZSgiUHJvdmluY2VfU3RhdGUiID0gIkNhbmFkYSIsICJDb3VudHJ5X1JlZ2lvbiIgPSAiQ2FuYWRhIikKTm9fQ2FuYWRhX3ZpcnVzID0gdmlydXMgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiAhPSAiQ2hpbmEiLCBDb3VudHJ5X1JlZ2lvbiAhPSAiVW5pdGVkIFN0YXRlcyIsQ291bnRyeV9SZWdpb24gIT0gIkF1c3RyYWxpYSIsIENvdW50cnlfUmVnaW9uICE9ICJDYW5hZGEiKQpjb3VudHJ5X3ZpcnVzMTEgPSBmdWxsX2pvaW4oTm9fQ2FuYWRhX3ZpcnVzLCBDYW5hZGFfdmlydXMpCgojRm9yIEF1c3RyYWxpYQpBdXN0cmFsaWFfdmlydXMgPSB2aXJ1cyAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJBdXN0cmFsaWEiKSU+JSBncm91cF9ieShEYXRlKSAlPiUgc3VtbWFyaXplKENvbmZpcm1lZCA9IHN1bShDb25maXJtZWQpLERlYXRocyA9IHN1bShEZWF0aHMpKSAlPiUgbXV0YXRlKCJQcm92aW5jZV9TdGF0ZSIgPSAiQXVzdHJhbGlhIiwgIkNvdW50cnlfUmVnaW9uIiA9ICJBdXN0cmFsaWEiKQpOb19BdXN0cmFsaWFfdmlydXMgPSB2aXJ1cyAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uICE9ICJBdXN0cmFsaWEiLCBDb3VudHJ5X1JlZ2lvbiAhPSAiVW5pdGVkIFN0YXRlcyIsQ291bnRyeV9SZWdpb24gIT0gIkNoaW5hIiwgQ291bnRyeV9SZWdpb24gIT0gIkNhbmFkYSIpCmNvdW50cnlfdmlydXMyID0gZnVsbF9qb2luKE5vX0F1c3RyYWxpYV92aXJ1cywgQXVzdHJhbGlhX3ZpcnVzKQoKcHJlZGF0YSA9IGZ1bGxfam9pbihjb3VudHJ5X3ZpcnVzLGNvdW50cnlfdmlydXMxKQpteWRhdGEgPSBmdWxsX2pvaW4ocHJlZGF0YSxjb3VudHJ5X3ZpcnVzMikKbXlkYXRhMiA9IGZ1bGxfam9pbihteWRhdGEsY291bnRyeV92aXJ1czExKQojbXlkYXRhMiAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJDYW5hZGEiKQpgYGAKCmBgYHtyfQpteWRhdGEyCiNHRFBhbmRXZWF0aGVyID0gR0RQYW5kV2VhdGhlciAlPiUgcmVuYW1lKCJDb3VudHJ5X1JlZ2lvbiI9IENvdW50cnkpCkdEUGFuZFdlYXRoZXIKcGFydGlhbGRhdGEgPSBsZWZ0X2pvaW4obXlkYXRhMixHRFBhbmRXZWF0aGVyLGJ5ID0gIkNvdW50cnlfUmVnaW9uIikKY291bnRyeV9wb3B1bGF0aW9uXzIgPSBjb3VudHJ5X3BvcHVsYXRpb25fMSAlPiUgcmVuYW1lKCJDb3VudHJ5X1JlZ2lvbiI9IENvdW50cnkpCm91cmZpbmFsZGF0YSA9IGxlZnRfam9pbihwYXJ0aWFsZGF0YSxjb3VudHJ5X3BvcHVsYXRpb25fMiwgYnkgPSAiQ291bnRyeV9SZWdpb24iKQoKYGBgCgpGaWx0ZXIgYnkgdGhlIHByZXZpb3VzIGRheSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbW9zdCByZWNlbnQgZGF0YS4KYGBge3J9Cm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJVbml0ZWQgU3RhdGVzIikKCiNvdXJmaW5hbGRhdGEKI3Bvc3RlciA9IG91cmZpbmFsZGF0YSAlPiUgZHBseXI6OnNlbGVjdCgtUHJvdmluY2VfU3RhdGUsLVJlY292ZXJlZCkKYGBgCgoKYGBge3J9CndyaXRlX2NzdihvdXJmaW5hbGRhdGEsICJvdXJmaW5hbGRhdGEuY3N2IikKbGlicmFyeShsdWJyaWRhdGUpCmBgYAoKI0NvZGUgdG8gQW5hbHl6ZSBvdXIgQ1NWIGZpbGUKCmBgYHtyfQojRm9ybWF0dGluZyB0aGUgdmFyaWFibGUgZGF0ZSBhcyBtZHkgYW5kIG9yZGVyaW5nIGl0Cm91cmZpbmFsZGF0YSREYXRlIDwtYXMuRGF0ZShvdXJmaW5hbGRhdGEkRGF0ZSwgZm9ybWF0ID0gIiVtLyVkLyV5IikKI09uZSBQbG90IG9mIFdvcmxkIERlYXRocwpvdXJmaW5hbGRhdGEgJT4lIGdyb3VwX2J5KERhdGUpICU+JSBzdW1tYXJpemUoVG90YWwgPSBzdW0oQ29uZmlybWVkLG5hLnJtID0gVFJVRSksIERlYWRfY291bnQgPSBzdW0oRGVhdGhzLG5hLnJtID0gVFJVRSkpICU+JSBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBUb3RhbCxncm91cD0xLCBzaXplID0gRGVhZF9jb3VudCkpICsgIGdndGl0bGUoIldvcmxkIENhc2VzIGFuZCBEZWF0aHMgR3JhcGggMSIpCgojQW5vdGhlciBQbG90IG9mIFdvcmxkIERlYXRocwpvdXJmaW5hbGRhdGEgJT4lIGdyb3VwX2J5KERhdGUpICU+JSBzdW1tYXJpemUoVG90YWwgPSBzdW0oQ29uZmlybWVkLG5hLnJtID0gVFJVRSksIERlYWRfY291bnQgPSBzdW0oRGVhdGhzLG5hLnJtID0gVFJVRSkpICU+JSBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBUb3RhbCxncm91cCA9IDEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhZF9jb3VudCwgZ3JvdXAgPSAxKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIldvcmxkIENhc2VzIGFuZCBEZWF0aHMgR3JhcGggMiIpCgojRGVhdGhzIGluIENoaW5hCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJDaGluYSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiQ2hpbmEgQ2FzZXMgYW5kIERlYXRocyIpCgojRGVhdGhzIGluIFVuaXRlZCBTdGF0ZXMKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lIGFycmFuZ2UoRGF0ZSklPiUgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJVbml0ZWQgU3RhdGVzIENhc2VzIGFuZCBEZWF0aHMiKQpVU0FfdHJlbmRzID0gb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lIGFycmFuZ2UoRGF0ZSkKd3JpdGVfY3N2KFVTQV90cmVuZHMsICJVU0FfdHJlbmRzLmNzdiIpIAoKI0RlYXRocyBpbiBTb3V0aCBLb3JlYQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiU291dGggS29yZWEiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIlNvdXRoIEtvcmVhIENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBJdGFseQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiSXRhbHkiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkl0YWx5IENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBTcGFpbgpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiU3BhaW4iKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIlNwYWluIENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBJcmFuCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJJcmFuIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJJcmFuIENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBTd2VlZGVuCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJTd2VkZW4iKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIlN3ZWRlbiBDYXNlcyBhbmQgRGVhdGhzIikKYGBgCgpgYGB7cn0KI0RlYXRocyBpbiBDYW5hZGEKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkNhbmFkYSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiQ2FuYWRhIENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBKYXBhbgpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiSmFwYW4iKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkphcGFuIENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBDb3N0YSBSaWNhCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJDb3N0YSBSaWNhIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJDb3N0YSBSaWNhIENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBHZXJtYW55Cm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJHZXJtYW55IikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJHZXJtYW55IENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBVbml0ZWQgS2luZ2RvbQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiVW5pdGVkIEtpbmdkb20iJiBpcy5uYShQcm92aW5jZV9TdGF0ZSkpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiVW5pdGVkIEtpbmdkb20gQ2FzZXMgYW5kIERlYXRocyIpCgojRGVhdGhzIGluIEZyYW5jZQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiRnJhbmNlIiAmIGlzLm5hKFByb3ZpbmNlX1N0YXRlKSkgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJGcmFuY2UgQ2FzZXMgYW5kIERlYXRocyIpCgojUnVzc2lhCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJSdXNzaWEiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIlJ1c3NpYSBDYXNlcyBhbmQgRGVhdGhzIikKCiNFZ3lwdApvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiRWd5cHQiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkVneXB0IENhc2VzIGFuZCBEZWF0aHMiKQoKI1NvdXRoIEFmcmljYQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiU291dGggQWZyaWNhIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJTb3V0aCBBZnJpY2EgQ2FzZXMgYW5kIERlYXRocyIpCmBgYAoKCmBgYHtyfQojRmlubGFkCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJGaW5sYW5kIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJGaW5sYW5kIENhc2VzIGFuZCBEZWF0aHMiKQoKI0F1c3RyaWEKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkF1c3RyaWEiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkF1c3RyaWEgQ2FzZXMgYW5kIERlYXRocyIpCgojUG9ydHVnYWwKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlBvcnR1Z2FsIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJQb3J0dWdhbCBDYXNlcyBhbmQgRGVhdGhzIikKCiNJbmRvbmVzaWEKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkluZG9uZXNpYSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiSW5kb25lc2lhIENhc2VzIGFuZCBEZWF0aHMiKQoKI0F1c3RyYWxpYQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiQXVzdHJhbGlhIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJBdXN0cmFsaWEgQ2FzZXMgYW5kIERlYXRocyIpCgojTWV4aWNvCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJNZXhpY28iKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIk1leGljbyBDYXNlcyBhbmQgRGVhdGhzIikKCmBgYAoKYGBge3J9CiNTZXJiaWEKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlNlcmJpYSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiU2VyYmlhIENhc2VzIGFuZCBEZWF0aHMiKQoKI0ljZWxhbmQKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkljZWxhbmQiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkljZWxhbmQgQ2FzZXMgYW5kIERlYXRocyIpCgojQWZnaGFuaXN0YW4Kb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkFmZ2hhbmlzdGFuIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJBZmdoYW5pc3RhbiBDYXNlcyBhbmQgRGVhdGhzIikKCiNOb3J3YXkKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIk5vcndheSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiTm9yd2F5IENhc2VzIGFuZCBEZWF0aHMiKQpgYGAKCmBgYHtyfQojQ29tcGFyaXNvbiBvZiBUb3RhbCBDYXNlcyBpbiBlYWNoIGNvdW50cnkKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMifENvdW50cnlfUmVnaW9uID09ICJJdGFseSJ8Q291bnRyeV9SZWdpb249PSJDaGluYSJ8Q291bnRyeV9SZWdpb24gPT0gIlNwYWluInxDb3VudHJ5X1JlZ2lvbiA9PSAiSXJhbiJ8Q291bnRyeV9SZWdpb24gPT0gIkF1c3RyYWxpYSJ8Q291bnRyeV9SZWdpb24gPT0gIlNvdXRoIEtvcmVhInxDb3VudHJ5X1JlZ2lvbiA9PSAiQ2FuYWRhInxDb3VudHJ5X1JlZ2lvbiA9PSAiQnJhemlsIiApICU+JSBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4PURhdGUseSA9IENvbmZpcm1lZCwgY29sb3IgPSBDb3VudHJ5X1JlZ2lvbikpK2dlb21fbGluZSgpICtnZ3RpdGxlKCJUb3RhbCBDb25maXJtZWQgQ2FzZXMgT3ZlciBUaW1lIikKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMifENvdW50cnlfUmVnaW9uID09ICJJdGFseSJ8Q291bnRyeV9SZWdpb249PSJDaGluYSJ8Q291bnRyeV9SZWdpb24gPT0gIlNwYWluInxDb3VudHJ5X1JlZ2lvbiA9PSAiSXJhbiJ8Q291bnRyeV9SZWdpb24gPT0gIkF1c3RyYWxpYSJ8Q291bnRyeV9SZWdpb24gPT0gIlNvdXRoIEtvcmVhInxDb3VudHJ5X1JlZ2lvbiA9PSAiQ2FuYWRhInxDb3VudHJ5X1JlZ2lvbiA9PSAiQnJhemlsIikgJT4lIGdncGxvdChtYXBwaW5nID0gYWVzKHg9RGF0ZSx5ID0gRGVhdGhzLCBjb2xvciA9IENvdW50cnlfUmVnaW9uKSkrZ2VvbV9saW5lKCkgK2dndGl0bGUoIlRvdGFsIENvbmZpcm1lZCBEZWF0aHMgT3ZlciBUaW1lIikKYGBgCgoKClBsb3RzIG9mIHRoZSBQZXJjZW50YWdlIG9mIFBvcHVsYXRpb24gSW5mZWN0ZWQKYGBge3J9CgojTm90ZSB0aGUgeS1heGlzIGZvciB0aGVzZSBncmFwaHMgc2hvdWxkIGJlIDAtMTAwIGJlY2F1c2UgY2FsY3VsYXRlZCBhcyBhIHBlcmNlbnQgYnV0IHRoaXMgc2hvd3MgaG93IGZldyBwZW9wbGUgaGF2ZSBpdCBhdCB0aGlzIHBvaW50CiNVU0EKb3VyZmluYWxkYXRhICU+JWZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiVW5pdGVkIFN0YXRlcyIpICU+JWdyb3VwX2J5KERhdGUpJT4lIHN1bW1hcml6ZShUb3RhbCA9IHN1bShDb25maXJtZWQpLFBvcCA9IFBvcHVsYXRpb25fMjAyMCkgJT4lIG11dGF0ZSgiUGVyY2VudF9JbmZlY3RlZCIgPSAoVG90YWwvUG9wKSoxMDApICU+JSBnZ3Bsb3QoKStnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gRGF0ZSwgeSA9IFBlcmNlbnRfSW5mZWN0ZWQpKSArIHlsaW0oMCwxKSArZ2d0aXRsZSgiUGVyY2VudGFuZ2Ugb2YgUGVvcGxlIEluZmVjdGVkIGluIHRoZSBVU0EiKQoKI0NoaW5hCm91cmZpbmFsZGF0YSAlPiVmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkNoaW5hIikgJT4lZ3JvdXBfYnkoRGF0ZSklPiUgc3VtbWFyaXplKFRvdGFsID0gc3VtKENvbmZpcm1lZCksUG9wID0gUG9wdWxhdGlvbl8yMDIwKSAlPiUgbXV0YXRlKCJQZXJjZW50X0luZmVjdGVkIiA9IChUb3RhbC9Qb3ApKjEwMCkgJT4lIGdncGxvdCgpK2dlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSBEYXRlLCB5ID0gUGVyY2VudF9JbmZlY3RlZCkpICsgeWxpbSgwLDEpICtnZ3RpdGxlKCJQZXJjZW50YW5nZSBvZiBQZW9wbGUgSW5mZWN0ZWQgaW4gQ2hpbmEiKQoKI0l0YWx5Cm91cmZpbmFsZGF0YSAlPiVmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkl0YWx5IikgJT4lZ3JvdXBfYnkoRGF0ZSklPiUgc3VtbWFyaXplKFRvdGFsID0gc3VtKENvbmZpcm1lZCksUG9wID0gUG9wdWxhdGlvbl8yMDIwKSAlPiUgbXV0YXRlKCJQZXJjZW50X0luZmVjdGVkIiA9IChUb3RhbC9Qb3ApKjEwMCkgJT4lIGdncGxvdCgpK2dlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSBEYXRlLCB5ID0gUGVyY2VudF9JbmZlY3RlZCkpICsgeWxpbSgwLDEpICtnZ3RpdGxlKCJQZXJjZW50YW5nZSBvZiBQZW9wbGUgSW5mZWN0ZWQgaW4gSXRhbHkiKQoKI1NwYWluCm91cmZpbmFsZGF0YSAlPiVmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlNwYWluIikgJT4lZ3JvdXBfYnkoRGF0ZSklPiUgc3VtbWFyaXplKFRvdGFsID0gc3VtKENvbmZpcm1lZCksUG9wID0gUG9wdWxhdGlvbl8yMDIwKSAlPiUgbXV0YXRlKCJQZXJjZW50X0luZmVjdGVkIiA9IChUb3RhbC9Qb3ApKjEwMCkgJT4lIGdncGxvdCgpK2dlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSBEYXRlLCB5ID0gUGVyY2VudF9JbmZlY3RlZCkpICsgeWxpbSgwLDEpICtnZ3RpdGxlKCJQZXJjZW50YW5nZSBvZiBQZW9wbGUgSW5mZWN0ZWQgaW4gU3BhaW4iKQoKI0luZGlhCm91cmZpbmFsZGF0YSAlPiVmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkluZGlhIikgJT4lZ3JvdXBfYnkoRGF0ZSklPiUgc3VtbWFyaXplKFRvdGFsID0gc3VtKENvbmZpcm1lZCksUG9wID0gUG9wdWxhdGlvbl8yMDIwKSAlPiUgbXV0YXRlKCJQZXJjZW50X0luZmVjdGVkIiA9IChUb3RhbC9Qb3ApKjEwMCkgJT4lIGdncGxvdCgpK2dlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSBEYXRlLCB5ID0gUGVyY2VudF9JbmZlY3RlZCkpICsgeWxpbSgwLDEpICtnZ3RpdGxlKCJQZXJjZW50YW5nZSBvZiBQZW9wbGUgSW5mZWN0ZWQgaW4gSW5kaWEiKQoKI0lyYW4Kb3VyZmluYWxkYXRhICU+JWZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiSXJhbiIpICU+JWdyb3VwX2J5KERhdGUpJT4lIHN1bW1hcml6ZShUb3RhbCA9IHN1bShDb25maXJtZWQpLFBvcCA9IFBvcHVsYXRpb25fMjAyMCkgJT4lIG11dGF0ZSgiUGVyY2VudF9JbmZlY3RlZCIgPSAoVG90YWwvUG9wKSoxMDApICU+JSBnZ3Bsb3QoKStnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gRGF0ZSwgeSA9IFBlcmNlbnRfSW5mZWN0ZWQpKSArIHlsaW0oMCwxKSArZ2d0aXRsZSgiUGVyY2VudGFuZ2Ugb2YgUGVvcGxlIEluZmVjdGVkIGluIElyYW4iKQoKI1NvdXRoIEFmcmljYQpvdXJmaW5hbGRhdGEgJT4lZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJTb3V0aCBBZnJpY2EiKSAlPiVncm91cF9ieShEYXRlKSU+JSBzdW1tYXJpemUoVG90YWwgPSBzdW0oQ29uZmlybWVkKSxQb3AgPSBQb3B1bGF0aW9uXzIwMjApICU+JSBtdXRhdGUoIlBlcmNlbnRfSW5mZWN0ZWQiID0gKFRvdGFsL1BvcCkqMTAwKSAlPiUgZ2dwbG90KCkrZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IERhdGUsIHkgPSBQZXJjZW50X0luZmVjdGVkKSkgKyB5bGltKDAsMSkgK2dndGl0bGUoIlBlcmNlbnRhbmdlIG9mIFBlb3BsZSBJbmZlY3RlZCBpbiBTb3V0aCBBZnJpY2EiKQpgYGAKCgojTG9naXN0aWMgR3Jvd3RoIGZvciBJdGFseQpgYGB7cn0Kb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkl0YWx5IikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJJdGFseSBDYXNlcyBhbmQgRGVhdGhzIikKCm51bV9kYXlzX0l0YWx5ID0gbnJvdyhvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiSXRhbHkiLENvbmZpcm1lZCA+PTEpKQpJdGFseV9kYXQgPSBvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiSXRhbHkiLENvbmZpcm1lZCA+PTEpICU+JSBtdXRhdGUoIk51bV9EYXlzX1NpbmNlX1N0YXJ0Ij1jKDE6bnVtX2RheXNfSXRhbHkpKQoKSXRhbHlfbW9kID0gbmxzKENvbmZpcm1lZCB+ICBjLygxK2EqZXhwKGIqTnVtX0RheXNfU2luY2VfU3RhcnQpKSwgc3RhcnQgPSBsaXN0KGE9MTAwLCBiID0gLTAuMTMsIGMgPSBtYXgoSXRhbHlfZGF0JENvbmZpcm1lZCkpLCBkYXRhID0gSXRhbHlfZGF0KQpjb2VmKHN1bW1hcnkoSXRhbHlfbW9kKSkKCnBsb3QoSXRhbHlfZGF0JE51bV9EYXlzX1NpbmNlX1N0YXJ0LEl0YWx5X2RhdCRDb25maXJtZWQseGxhYiA9ICJOdW1iZXIgb2YgRGF5cyBTaW5jZSBTdGFydCIseWxhYiA9ICJOdW1iZXIgb2YgQ29uZmlybWVkIENhc2VzIixtYWluID0gIkxvZ2lzdGljIFJlZ3Jlc3Npb24gZm9yIEl0YWx5IikKY3VydmUoMi4xNDU5NzdlKzA1LygxKzY5Mi4yKmV4cCh4Ki0wLjEwNCkpLCBjb2wgPSAiYmx1ZSIsIGFkZCA9IFRSVUUpCiNsaW5lcyhJdGFseV9kYXQkTnVtX0RheXNfU2luY2VfU3RhcnQsIHByZWRpY3QoSXRhbHlfbW9kKSwgY29sID0gMikKCgpgYGAKCiNMb2dpc3RpYyBHcm93dGggZm9yIFVuaXRlZCBTdGF0ZXMKYGBge3J9Cm51bV9kYXlzX1VTQSA9IG5yb3cob3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMiLENvbmZpcm1lZCA+MSkpClVTQV9kYXQgPSBvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiVW5pdGVkIFN0YXRlcyIsQ29uZmlybWVkID4xKSAlPiUgbXV0YXRlKCJOdW1fRGF5c19TaW5jZV9TdGFydCI9YygxOm51bV9kYXlzX1VTQSkpICU+JSBhcnJhbmdlKERhdGUpCgojVXNpbmcgTm9ubGluZWFyIExlYXN0IFNxdWFyZXMgTG9naXN0aWMgR3Jvd3RoIE1vZGVsCiNVU0FfbW9kID0gbmxzKENvbmZpcm1lZCB+ICBjLygxK2EqZXhwKGIqTnVtX0RheXNfU2luY2VfU3RhcnQpKSwgc3RhcnQgPSBsaXN0KGE9MzAwMDAuMywgYiA9IC0wLjEwLCBjID0gbWF4KFVTQV9kYXQkQ29uZmlybWVkKSksIGRhdGEgPSBVU0FfZGF0KQojY29lZihzdW1tYXJ5KFVTQV9tb2QpKQpgYGAKCiNMb2dpc3RpYyBHcm93dGggZm9yIENoaW5hCmBgYHtyfQpudW1fZGF5c19DaGluYSA9IG5yb3cob3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkNoaW5hIixDb25maXJtZWQgPjMpKQpDaGluYV9kYXQgPSBvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiQ2hpbmEiLENvbmZpcm1lZCA+MykgJT4lIG11dGF0ZSgiTnVtX0RheXNfU2luY2VfU3RhcnQiPWMoMTpudW1fZGF5c19DaGluYSkpICU+JSBhcnJhbmdlKERhdGUpCgojVXNpbmcgTm9ubGluZWFyIExlYXN0IFNxdWFyZXMgTG9naXN0aWMgR3Jvd3RoIE1vZGVsCkNoaW5hX21vZCA9IG5scyhDb25maXJtZWQgfiAgYy8oMSthKmV4cChiKk51bV9EYXlzX1NpbmNlX1N0YXJ0KSksIHN0YXJ0ID0gbGlzdChhPTY1LjI5LCBiID0gLTAuMjIzLCBjID0gODM3ODcpLCBkYXRhID0gQ2hpbmFfZGF0KQpjb2VmKHN1bW1hcnkoQ2hpbmFfbW9kKSkKCgpwbG90KENoaW5hX2RhdCROdW1fRGF5c19TaW5jZV9TdGFydCxDaGluYV9kYXQkQ29uZmlybWVkLHhsYWIgPSAiTnVtYmVyIG9mIERheXMgU2luY2UgU3RhcnQiLHlsYWIgPSAiTnVtYmVyIG9mIENvbmZpcm1lZCBDYXNlcyIsbWFpbiA9ICJMb2dpc3RpYyBSZWdyZXNzaW9uIGZvciBDaGluYSIpCmN1cnZlKDc3MTMxLjI2LygxKzQ3OS4xNSpleHAoeCotMC40ODApKSwgY29sID0gImJsdWUiLCBhZGQgPSBUUlVFKQpgYGAKCiNMb2dpc3RpYyBHcm93dGggZm9yIFNwYWluCmBgYHtyfQpudW1fZGF5c19TcGFpbiA9IG5yb3cob3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlNwYWluIixDb25maXJtZWQgPjMpKQpTcGFpbl9kYXQgPSBvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiU3BhaW4iLENvbmZpcm1lZCA+MykgJT4lIG11dGF0ZSgiTnVtX0RheXNfU2luY2VfU3RhcnQiPWMoMTpudW1fZGF5c19TcGFpbikpICU+JSBhcnJhbmdlKERhdGUpCgojVXNpbmcgTm9ubGluZWFyIExlYXN0IFNxdWFyZXMgTG9naXN0aWMgR3Jvd3RoIE1vZGVsClNwYWluX21vZCA9IG5scyhDb25maXJtZWQgfiAgYy8oMSthKmV4cChiKk51bV9EYXlzX1NpbmNlX1N0YXJ0KSksIHN0YXJ0ID0gbGlzdChhPTMwLjI5LCBiID0gLTAuMjAsIGMgPSAxOTE3MjYpLCBkYXRhID0gU3BhaW5fZGF0KQpjb2VmKHN1bW1hcnkoU3BhaW5fbW9kKSkKYGBgCgojQ291bnR5L1N0YXRlIERhdGEgZm9yIFVTCgpgYGB7cn0KbXlfY291bnRpZXMgPSByZWFkX2NzdigidXNhX2NvdW50eV93aXNlLmNzdiIpCm15X2NvdW50aWVzJERhdGUgPC1hcy5EYXRlKG15X2NvdW50aWVzJERhdGUsIGZvcm1hdCA9ICIlbS8lZC8leSIpCm15X2NvdW50aWVzICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIlBlbm5zeWx2YW5pYSIgJiBEYXRlID09ICIyMDIwLTA2LTEwIikKCm15X2NvdW50aWVzICU+JSBmaWx0ZXIoUHJvdmluY2VfU3RhdGUgPT0gIlBlbm5zeWx2YW5pYSJ8UHJvdmluY2VfU3RhdGUgPT0gIk5ldyBZb3JrInxQcm92aW5jZV9TdGF0ZSA9PSAiTmV3IEplcnNleSJ8UHJvdmluY2VfU3RhdGUgPT0gIkRlbGF3YXJlInxQcm92aW5jZV9TdGF0ZSA9PSAiQ2FsaWZvcm5pYSJ8UHJvdmluY2VfU3RhdGUgPT0gIk1pY2hpZ2FuInxQcm92aW5jZV9TdGF0ZSA9PSAiQXJpem9uYSIpICU+JSBncm91cF9ieShEYXRlLFByb3ZpbmNlX1N0YXRlKSAlPiUgc3VtbWFyaXplKHN0YXRlX3RvdGFsID0gc3VtKENvbmZpcm1lZCkpJT4lIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBEYXRlLCB5ID0gc3RhdGVfdG90YWwsY29sb3IgPSBQcm92aW5jZV9TdGF0ZSkpK2dlb21fbGluZSgpK2dndGl0bGUoIkNvbmZpcm1lZCBDYXNlcyBhY3Jvc3MgdGhlIFN0YXRlcyIpCgoKbXlfY291bnRpZXMgJT4lIGZpbHRlcihEYXRlID09ICIyMDIwLTA2LTEwIikgJT4lIGdyb3VwX2J5KFByb3ZpbmNlX1N0YXRlKSAlPiUgc3VtbWFyaXplKHN0YXRlX3RvdGFsID0gc3VtKENvbmZpcm1lZCkpICU+JSB0b3BfbihzdGF0ZV90b3RhbCxuPTIwKSAlPiUgYXJyYW5nZShkZXNjKHN0YXRlX3RvdGFsKSkKbXlfY291bnRpZXMgJT4lIGZpbHRlcihEYXRlID09ICIyMDIwLTA2LTEwIikgJT4lIGdyb3VwX2J5KFByb3ZpbmNlX1N0YXRlKSAlPiUgc3VtbWFyaXplKHN0YXRlX3RvdGFsID0gc3VtKENvbmZpcm1lZCkpICU+JSB0b3BfbihzdGF0ZV90b3RhbCxuPS0yMCkgJT4lIGFycmFuZ2UoZGVzYyhzdGF0ZV90b3RhbCkpCgoKbXlfY291bnRpZXMgJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiUGVubnN5bHZhbmlhIikgJT4lZmlsdGVyKEFkbWluMiA9PSAiTGVoaWdoInxBZG1pbjIgID09ICJOb3J0aGFtcHRvbiJ8QWRtaW4yID09ICJCZXJrcyJ8QWRtaW4yID09ICJMdXplcm5lIikgJT4lIGdyb3VwX2J5KEFkbWluMikgJT4lIHRvcF9uKENvbmZpcm1lZCwyMCklPiVnZ3Bsb3QoYWVzKHggPSBEYXRlLHkgPSBDb25maXJtZWQsY29sb3IgPSBBZG1pbjIpKStnZW9tX2xpbmUoKQoKbXlfY291bnRpZXMgJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSA9PSAiUGVubnN5bHZhbmlhIiYgRGF0ZSA9PSAiMjAyMC0wNi0xMCIpICU+JSBhcnJhbmdlKGRlc2MoQ29uZmlybWVkKSkgJT4lIG11dGF0ZShEZWF0aFJhdGUgPSBEZWF0aHMvQ29uZmlybWVkKQpgYGAKCiNEZXZlbG9waW5nIENvdW50cmllcwpMaXN0IG9mIGRldmVsb3BpbmcgY291bnRyaWVzIGluIG91ciBkYXRhc2V0OgpDaGFkLCBDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMsIEJodXRhbiwgQWZnaGFuaXN0YW4sIE1hbGksIE1hbGF3aSwgRXJpdHJlYSwgSGFpdGksIEJlbmluLCBOaWdlciwgTGFvcywgR3VpbmVhLCBDYW1ib2RpYSwgTWF1cml0YW5pYSwgTGliZXJpYSwgQmFuZ2xhZGVzaCwgR2VvcmdpYSwgUGFuYW1hLCBCdWxnYXJpYQoKI0xvZ2lzdGljIEdyb3d0aCBmb3IgRGV2ZWxvcGluZyBDb3VudHJpZXMKTG9naXN0aWMgR3Jvd3RoIGZvciBCdWxnYXJpYQpgYGB7cn0KI0J1bGdhcmlhCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJCdWxnYXJpYSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiQnVsZ2FyaWEgQ2FzZXMgYW5kIERlYXRocyIpCgpudW1fZGF5c19CdWxnYXJpYSA9IG5yb3cob3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkJ1bGdhcmlhIixDb25maXJtZWQgPjMpKQpCdWxnYXJpYV9kYXQgPSBvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiQnVsZ2FyaWEiLENvbmZpcm1lZCA+PTEpICU+JSBtdXRhdGUoIk51bV9EYXlzX1NpbmNlX1N0YXJ0Ij1jKDE6bnVtX2RheXNfQnVsZ2FyaWEpKQoKQnVsZ2FyaWFfbW9kID0gbmxzKENvbmZpcm1lZCB+ICBjLygxK2EqZXhwKGIqTnVtX0RheXNfU2luY2VfU3RhcnQpKSwgc3RhcnQgPSBsaXN0KGE9MTYuNywgYiA9IC0wLjE0ODksIGMgPSA3ODguNzYpLCBkYXRhID0gQnVsZ2FyaWFfZGF0KQpjb2VmKHN1bW1hcnkoQnVsZ2FyaWFfbW9kKSkKCmBgYAoKI0NhbWJvZGlhIExvZ2lzdGljIEdyb3d0aApgYGB7cn0Kb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkNhbWJvZGlhIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJDYW1ib2RpYSBDYXNlcyBhbmQgRGVhdGhzIikKCm51bV9kYXlzX0NhbWJvZGlhID0gbnJvdyhvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiQ2FtYm9kaWEiLENvbmZpcm1lZCA+PTEpKQpDYW1ib2RpYV9kYXQgPSBvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiQ2FtYm9kaWEiLENvbmZpcm1lZCA+PTEpICU+JSBtdXRhdGUoIk51bV9EYXlzX1NpbmNlX1N0YXJ0Ij1jKDE6bnVtX2RheXNfQ2FtYm9kaWEpKQoKQ2FtYm9kaWFfbW9kID0gbmxzKENvbmZpcm1lZCB+ICBjLygxK2EqZXhwKGIqTnVtX0RheXNfU2luY2VfU3RhcnQpKSwgc3RhcnQgPSBsaXN0KGE9MTYuNywgYiA9IC0wLjEsIGMgPSAxNDApLCBkYXRhID0gQ2FtYm9kaWFfZGF0KQoKY29lZihzdW1tYXJ5KENhbWJvZGlhX21vZCkpCgpwbG90KENhbWJvZGlhX2RhdCROdW1fRGF5c19TaW5jZV9TdGFydCxDYW1ib2RpYV9kYXQkQ29uZmlybWVkLHhsYWIgPSAiTnVtYmVyIG9mIERheXMgU2luY2UgU3RhcnQiLHlsYWIgPSAiTnVtYmVyIG9mIENvbmZpcm1lZCBDYXNlcyIsbWFpbiA9ICJMb2dpc3RpYyBSZWdyZXNzaW9uIGZvciBDYW1ib2RpYSIpCmN1cnZlKDExNy4wMS8oMSsxLjY1NjU4NGUrMDgqZXhwKHgqLTAuMzQ1KSksIGNvbCA9IDQsIGFkZCA9IFRSVUUpCiNsaW5lcyhDYW1ib2RpYV9kYXQkTnVtX0RheXNfU2luY2VfU3RhcnQsIHByZWRpY3QoQ2FtYm9kaWFfbW9kKSwgY29sID0gMikKYGBgCgpgYGB7cn0Kb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlBhbmFtYSIgfCBDb3VudHJ5X1JlZ2lvbiA9PSAiTm9yd2F5InwgQ291bnRyeV9SZWdpb24gPT0gIkdlb3JnaWEifENvdW50cnlfUmVnaW9uID09ICJCYW5nbGFkZXNoInxDb3VudHJ5X1JlZ2lvbiA9PSAiR3VpbmVhIiklPiUgZ3JvdXBfYnkoRGF0ZSxDb3VudHJ5X1JlZ2lvbiklPiUgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsY29sb3IgPSBDb3VudHJ5X1JlZ2lvbikpK2dlb21fbGluZSgpK2dndGl0bGUoIkNvbmZpcm1lZCBDYXNlcyBhY3Jvc3MgdGhlIFdvcmxkIikKYGBgCgojSnVuawpgYGB7cn0Kb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkJyYXppbCIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiQnJhemlsIENhc2VzIGFuZCBEZWF0aHMiKQpgYGAKCg==